package org.dromara.netbar.domain.bo;

import org.dromara.netbar.domain.NetbarCoupon;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;

/**
 * 通用卡券业务对象 netbar_coupon
 *
 * @author Lion Li
 * @date 2025-07-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = NetbarCoupon.class, reverseConvertGenerate = false)
public class NetbarCouponBo extends BaseEntity {

    /**
     * 卡券唯一ID
     */
    @NotNull(message = "卡券唯一ID不能为空", groups = { EditGroup.class })
    private Long couponId;

    /**
     * 卡券类型：代金券/包时券/折扣券
     */
    @NotBlank(message = "卡券类型：代金券/包时券/折扣券不能为空", groups = { AddGroup.class, EditGroup.class })
    private String couponType;

    /**
     * 卡券金额（代金券专用，如50元）
     */
    private Long couponAmount;

    /**
     * 购买金额（通用字段）
     */
    private Long purchaseAmount;

    /**
     * 生效金额（代金券字段）
     */
    private Long effectiveAmount;

    /**
     * 有效期类型：1=永久，2=指定日期
     */
    @NotNull(message = "有效期类型：1=永久，2=指定日期不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long validTermType;

    /**
     * 有效期开始（valid_term_type=2时必填）
     */
    private Date validDateStart;

    /**
     * 有效期结束（valid_term_type=2时必填）
     */
    private Date validDateEnd;

    /**
     * 是否自动使用：1=自动，2=手动
     */
    @NotNull(message = "是否自动使用：1=自动，2=手动不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long isAutoUse;

    /**
     * 卡券名称（自动拼接）
     */
    private String couponName;

    /**
     * 有效区域（包时券/折扣券专用，如全区域、大厅）
     */
    private Long validArea;

    /**
     * 包时时长（小时，包时券专用，如3小时）
     */
    private Long hourDuration;

    /**
     * 可用时段开始（包时券专用，如8点-23点）
     */
    private String usableTimeStart;

    /**
     * 可用时段结束（包时券专用，如8点-23点）
     */
    private String usableTimeEnd;

    /**
     * 折扣力度（折扣券专用，如7折）
     */
    private Long discountRate;

    /**
     * 会员等级ID（升级会员等级卡券专用）
     */
    private Long memberLevelId;
}
